package novel.manager.service.impl.spider.chapter;

import java.util.ArrayList;
import java.util.List;

import novel.manager.pojo.spider.Chapter;
import novel.manager.pojo.spider.NovelSiteEnum;
import novel.manager.service.iface.spider.chapter.IChapterSpider;
import novel.manager.service.impl.spider.AbstractSpider;
import novel.manager.service.utils.NovelSpiderUtil;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**1.抓取技术：httpclient抓取html2String+jsoup解析String+jquery选择器
*/
/**
 * 抓取任意网站的章节列表
 */
public abstract class AbstractChapterSpider extends AbstractSpider implements IChapterSpider {
	//继承了方法：抓取指定小说网站的整个页面所有内容，protected String crawl(String url) throws Exception {

	//从指定小说网站的整个页面所有内容中抓取章节列表
	@Override
	//url:章节列表页面
	public List<Chapter> getChapters(String url) {
		try {
			//抓取指定小说网站的整个页面所有内容
			String result = crawl(url);
			//Jsoup.parse解析HTML字符串到内存的Document中
			Document doc = Jsoup.parse(result);
			//设置网页的基本路径，因为网页中有的用的是相对路径
			doc.setBaseUri(url);
			//先获取指定url的NovelSiteEnum，然后根据NovelSiteEnum获取对应网站的解析规则的map形式，然后根据map中的章节列表解析规则获取到章节列表
			Elements as = doc.select(NovelSpiderUtil.getSpiderRuleMapByNovelSiteEnum(NovelSiteEnum.getEnumByUrl(url)).get("chapter-list-selector"));
			//定义章节列表
			List<Chapter> chapters = new ArrayList<>();
			//遍历章节列表的元素，提取出title和url来封装成Chapter对象并存到章节列表中
			for (Element a : as) {
				Chapter chapter = new Chapter();
				chapter.setTitle(a.text());
				/*Element.attr("href") – 直接获取URL。
				Element.attr("abs:href")或Element.absUrl("href") – 获取完整URL。如果HTML是从文件或字符串解析过来的，
				需要调用Jsoup.setBaseUri(String baseUri)来指定基URL，否则获取的完整URL只会是空字符串*/
				chapter.setUrl(a.absUrl("href"));
				chapters.add(chapter);
			}
			//返回章节列表
			return chapters;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}
